<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>


//     var arr1=arr.filter(function(item){
//           return item>3;
//       })
//       console.log(arr1);

// 当回调函数return返回为true时，将元素添加到新数组里



// 构造filter函数：
// filter()从数组中挑选出满足条件的数据形成新数组，不能修改元素

   var arr=[1,2,3,4,5];

    function array_filter(arr,fn){
        var arr1=[];
        for(var i=0; i<arr.length;i++){
            if(i in arr && fn(arr[i],i,arr)) arr1[arr1.length] = arr[i];

        }
        return arr1;
    }

    var arr1=array_filter(arr,function(item){
        return item>3;
    })
    console.log(arr1);

    

    
    // 构造reduce函数：
    // 从数组中通过各种处理，最后返回一个结果
    
    // value: 开始到结束的归并值
    // item： 数组元素
    // index：数组的索引值
    // arr：数组

    // 当value没有初始值时，数组第0项等于value，数组第1项等于item
    // 当value有初始值时，数组第0项等于item，等于item从第0项开始循环

    function array_reduce(arr,fn,initValue){
        if(arr.length===0) return;
        if(arr.length===1) return arr[0];
        var index = 1;
        var value=arr[0];
        if(initValue!==undefined){
            index=0;
            value=initValue;
        }
        for(;index<arr.length;index++){
           value=fn(value,arr[index],index,arr);
        }
        return value;
    }
   val =  array_reduce(arr,function(value,item){
        console.log(value,item);
        return value+item;
    },100)
    console.log(val);
// 1-判断arr.length长度为0和1时
// 2-假设没有初始 值，再判断有初始值时
// 3-利用for循环，对item遍历
// 4-利用函数带入值，进行循环
    
    
  


reduce实现filter  
    
    var arr=[1,2,3,4,5,6];

    var arr1=arr.reduce(function(value,item){
        if(item>3) value.push(item);
        return value;
    },[]);
    // 利用reduce把value归并到一处，push是在末尾添加元素
    
    
   
   
//    reduce 实现every
   
   
// var arr=[1,2,3,4,5,6];
//   var bool=arr.reduce(function(value,item){
//       if(value && item<=3) value=false;
//       return value;
//   },true) ;

//   value的初始值是true ，value为真时，执行代码
   
   
   
   
// reduce 实现some 
   
// var arr=[1,2,3,4,5,6];
//   var bool=arr.reduce(function(value,item){
//       if(!value && item>33) value=ture;
//       return value;
//   },false) ;
   
//   value的初始值是false ，value为假时，执行代码
   
   
   
//  reduce实现map  
//     var arr=[1,2,3,4,5,6];
//     var arr1 = arr.reduce(function(value,item){
//         value.push(item+10);
//         return value;
//     },[]);
//     console.log(arr1)
   
   

  
//   flatMap()函数将二维数组转换为一维数组
 
// 构造flatmap函数：

    // var arr = [1, 2, 3, 4, 5, [2, ,3, 4], 5, [4, 5, 6, 7]];
    // function array_flatmap(arr, fn) {
    //     var arr1 = [];
    //     for (var i = 0; i < arr.length; i++) {
    //       var value = fn(arr[i], i, arr);
    //       if (value && value.constructor === Array) {
    //         for (var j = 0; j < value.length; j++) {
    //           arr1[arr1.length] = value[j];
    //         }
    //       } else {
    //         arr1[arr1.length] = value;
    //       }
    //     }
    //     return arr1;
   
    //     var arr1=array_flatmap(arr,function(item){
    //         return item;
    //     })
    //     coonsole.log(arr1);
   
   
//    解决三层数组：
//     var arr1=array_flatmap(arr,function(item){
//         if(Array.isArray(item))
//         item=array_flatmap(item,function(t){
//             return t;
//         })
//         return item;
//     });
//     console.log(arr1);
   
   
   
   //   reduce实现flatMap
   
   var arr = [1, 2, 3, 4, 5, [2, [3, 4], 5], [4, 5, 6, 7]];

    var arr1=arr.reduce(function(value,item){
    return value.concat(item);
    },[]);
    console.log(arr1);
   
   
//    reduce实现join
   
var arr=[1,2,3,4,5,6];

var str=arr.reduce(function(value,item,index){
    return value+","+item;
});
console.log(str);
   
   
  


// 利用直接将查找一个对象
var arr=[
        {id:1001,name:"外星人电脑",info:"配置超高的PC电脑",price:35999,num:5},
        {id:1002,name:"苹果笔记本",info:"配置超高的笔记本",price:16990,num:3},
        {id:1003,name:"电竞椅",info:"人体工学电竞椅",price:26000,num:6},
        {id:1004,name:"电竞桌",info:"带超大显示器的桌子",price:13000,num:6},
    ]

   
    var o=arr.reduce(function(value,item){
            if(item.id===1002) value=item;
            return value;
        },null);
        console.log(o);
   
   
  
  
  
  
  
  
  </script>
</body>
</html>